package liuru.world.observation.controller.observability.metric;

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.Metrics;
import liuru.world.observation.controller.constant.MetricConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

@Component
public class FileTotalGauge {

    private static final Logger logger = LoggerFactory.getLogger(FileTotalGauge.class);

    // 使用Map来存储文件类型及其对应的计数器
    private final Map<String, AtomicInteger> fileCounts = new HashMap<>();

    // 初始化时，可以注册一些默认的文件类型（如果有的话）
    public FileTotalGauge() {
        // 动态注册Gauge，为每个已知的文件类型创建一个
        for (String type : MetricConstants.FILETYPES) {
            if (type.isBlank()) {
                logger.error("MetricConstants.FILETYPES含有非法文件类型：{}", type);
                continue;
            }
            try {
                fileCounts.put(type,new AtomicInteger(0));
                Gauge.builder(MetricConstants.FILE_TOTAL, () -> fileCounts.get(type).get())
                        .tags(MetricConstants.TYPE, type)
                        .description("文件总数（标签：文件类型-type）")
                        .register(Metrics.globalRegistry);
            }catch (Exception e){
                logger.error("该文件类型注册指标失败-{}： {}", type, e.getMessage(),e);
            }
        }
    }

    // 通用方法，用于增加指定类型的文件计数
    public void addFileCount(String type, int value) {
        fileCounts.computeIfAbsent(type, k -> new AtomicInteger(0)).addAndGet(value);
    }

    // 通用方法，用于减少指定类型的文件计数
    public void subtractFileCount(String type, int value) {
        fileCounts.computeIfAbsent(type, k -> new AtomicInteger(0)).addAndGet(-value);
    }

}
